package com.tanhua.dubbo.api;
import com.tanhua.domain.db.PageResult;
import com.tanhua.domain.mg.Comment;
import com.tanhua.domain.mg.Publish;
import com.tanhua.domain.mg.Video;
import com.tanhua.dubbo.mg.CommentApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Service;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

@Service
@Slf4j
public class CommentImpl implements CommentApi {
    //注入mongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;
    /**
     * 动态 视频 -点赞 喜欢 评论
     */
    @Override
    public Integer save(Comment comment) {
        //1.插入评论表
        //1.1补全comment插入评论时所需要的信息
        comment.setCreated(System.currentTimeMillis());
        comment.setId(ObjectId.get());
        //1.2调用MongoTemplate 传入comment对象
        mongoTemplate.insert(comment);
        //2.1 调用自定义方法 传入发布id和每次递增的值
        updatePulishAndVideo(comment,1);
        //3.1 调用自定义方法 传入comment对象 返回点赞数量
        return likeCount(comment).intValue();

    }
    /**
     * 取消 动态 视频 -点赞 喜欢 评论
     */
    @Override
    public Integer remove(Comment comment) {
        //1.创建Query对象
        Query query = new Query(Criteria.where("userId")
                .is(comment.getUserId()))
                .addCriteria(Criteria.where("publishId").is(comment.getPublishId()))
                .addCriteria(Criteria.where("pubType").is(comment.getPubType()))
                .addCriteria(Criteria.where("commentType").is(comment.getCommentType()));
        //2.调用MogoTemplate的方法 传入query
        mongoTemplate.remove(query,Comment.class);
        //3.更新发布表的数据
        updatePulishAndVideo(comment,-1);
        //4.查询表的数据
        return likeCount(comment).intValue();
    }
    /**
     * 根据发布id查询评论列表
     */
    @Override
    public PageResult<Comment> findPageById(Integer queryContextType,String publishOrVideoId, Integer page, Integer pagesize) {
        Query query = new Query();
        //0代表的是动态的评论列表 1代表视频的评论列表
        if(queryContextType==0){//视频id 那么查询的
            //查询条件
            query = new Query(Criteria.where("publishId").is(new ObjectId(publishOrVideoId)))//根据发布id查询评论表
                    .addCriteria(Criteria.where("commentType").is(2))//对动态内容进行评论
                    .addCriteria(Criteria.where("pubType").is(1))//对动态操作
                    .limit(pagesize).skip((page-1)*pagesize);//从第1页查 每页10条记录
        }
        else {
            //查询条件
            query = new Query(Criteria.where("publishId").is(new ObjectId(publishOrVideoId)))//根据发布id查询评论表
                    .addCriteria(Criteria.where("commentType").is(2))//对动态内容进行评论
                    .addCriteria(Criteria.where("pubType").is(2))//对视频操作
                    .limit(pagesize).skip((page-1)*pagesize);//从第1页查 每页10条记录
        }
        //设置分页条件 根据评论时间排序
        query.with(Sort.by(Sort.Order.desc("created")));
        //调用公共方法
        return getCommentPageResult(page, pagesize, query);
    }

    /**
     * 根据评论id查询查询评论用户
     * @param commendId
     * @return
     */
    @Override
    public Comment queryCommentById(String commendId) {
        return mongoTemplate.findById(commendId,Comment.class);
    }
    //评论列表翻页
    @Override
    public PageResult<Comment> findPageByPublishId(Integer pagesize, Integer page, String sortProp, String sortOrder, String messageID) {
       //创建查询条件
        Query query = new Query();
        //设置查询条件
        query.addCriteria(Criteria.where("publishId").is(new ObjectId(messageID)));
        query.addCriteria(Criteria.where("pubType").is(1));//动态
        query.addCriteria(Criteria.where("commentType").is(2));//评论
        //计算总记录数
        return getCommentPageResult(page, pagesize, query);
    }





    /**
     * 根据分页条件和查询条件 查询评论列表 并返回VO数据
     * @param page 当前页码
     * @param pagesize 每页显示记录数
     * @param query 查询条件
     * @return 返回PageResult<Comment>
     */
    private PageResult<Comment> getCommentPageResult(Integer page, Integer pagesize, Query query) {
        //查询分页数据
        List<Comment> comments = mongoTemplate.find(query, Comment.class);
        //计算总记录数
        long count = mongoTemplate.count(query, Comment.class);
        //创建PageResult<Comment>
        PageResult<Comment> commentPageResult = new PageResult<>();
        commentPageResult.setItems(comments);
        commentPageResult.setPage(page);
        commentPageResult.setPagesize(pagesize);
        //总页数计算
        long pages = (count / pagesize) + (count % pagesize > 0 ? 1 : 0);
        commentPageResult.setPages((int)pages);
        commentPageResult.setCounts((int)count);
        //返回结果
        return commentPageResult;
    }

    /**
     * 公共方法 更新发布表
     * @param comment
     * @param value
     */
    private void updatePulishAndVideo(Comment comment, int value) {
        //获取发布id
        ObjectId publishId = comment.getPublishId();
        //设置更新条件
        Query query = new Query(Criteria.where("_id").is(publishId));
        //设置更新数据
        Update update=new Update();
        update.inc(comment.getCol(),value);
        Class< ? > myClass=Publish.class;//默认是动态操作
        if(comment.getPubType()==3){//对评论操作
            myClass=Comment.class;
        }
        else if (comment.getPubType()==2){//对视频操作
            myClass=Video.class;
        }
        //更新数据
        // mongoTemplate.upsert(query,update, Publish.class);
        mongoTemplate.updateFirst(query,update,myClass);
    }

    /**
     * 公共方法 获取点赞数量
     * @param comment
     * @return
     */
    private Long likeCount(Comment comment) {
        //获取发布id
        ObjectId publishId = comment.getPublishId();
        //根据当前评论类型  查询不同的参数
        Query query = new Query(Criteria.where("_id").is(publishId));
        if(comment.getPubType()==1){ //对动态操作
            Publish publish = mongoTemplate.findOne(query, Publish.class);
            if(comment.getCommentType()==1){
                return (long)publish.getLikeCount();
            }
            else if (comment.getCommentType()==2){
                return (long)publish.getCommentCount();
            }
            else {
                return (long)publish.getLoveCount();
            }
        }
        else if (comment.getPubType()==2){//对视频操作
            Video video = mongoTemplate.findOne(query, Video.class);
            if(comment.getCommentType()==1){
                return (long)video.getLikeCount();
            }
            else if (comment.getCommentType()==2){
                return (long)video.getCommentCount();
            }
            else {
                return (long)video.getLoveCount();
            }
        }
        else{
            //对评论操作
            log.debug("获取点赞数量");
            //查询Comment表
            Comment co = mongoTemplate.findOne(query, Comment.class);
            //点赞操作
            if(comment.getCommentType()==1){
                return (long)co.getLikeCount();
            }
        }
        return (long)0;
    }

}
